package com.mediocre.rememberMe.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.builders.WebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.crypto.password.NoOpPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.web.util.matcher.AntPathRequestMatcher;

@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    @Bean
    PasswordEncoder passwordEncoder() {
        return NoOpPasswordEncoder.getInstance();
    }

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.inMemoryAuthentication()
                .withUser("admin")
                .password("admin").roles("admin");
    }

    @Override
    public void configure(WebSecurity web) throws Exception {
        web.ignoring().antMatchers("/js/**", "/css/**", "/images/**");
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
                .anyRequest().authenticated()
                .and()
                .formLogin()
                // 配置登录页面和登录接口的地址
                //   默认的登录页面和登录接口的地址都是 /login
                .loginPage("/login.html")
                // 配置登录接口地址
                //   默认的登录接口地址就是 登录页面的地址
                .loginProcessingUrl("/doLogin")
                .usernameParameter("user")
                .passwordParameter("passwd")
                // 前后端不分离的情况下，登录成功回调。该方式会重定向到 referer url
                .defaultSuccessUrl("/index")
                // 前后端不分离的情况下，登录成功回调。该方式会强制重定向到 /index
                //     NOTE: defaultSuccessUrl()和successForwardUrl() 只要配置一个就行
                // .successForwardUrl("/index")
                // 登录失败回调: 登录失败之后，会发生服务端跳转
                .failureForwardUrl("/logout")
                // 登录失败回调: 登录失败之后，会发生重定向
                //   NOTE: failureForwardUrl() 和 failureUrl() 也是设置一个即可
                // .failureUrl("/logout")
                .permitAll()
                // 注销登录的默认接口是 /logout，我们也可以配置
                .and()
                .logout()
                .logoutUrl("/logout")
                .logoutRequestMatcher(new AntPathRequestMatcher("/logout", "POST"))
                // 注销成功后要跳转的页面
                .logoutSuccessUrl("/index")
                // 清除 cookie
                .deleteCookies()
                // 清除认证信息，默认可以不用配置，默认就会清除
                .clearAuthentication(true)
                // 使 HttpSession 失效，默认可以不用配置，默认就会清除
                .invalidateHttpSession(true)
                .permitAll()
                .and()
                .csrf().disable();
    }
}
